<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
  </head>

  <body>
    <script type="text/javascript">
        /**
         *  题目的描述只是让我们处理属性没让处理成员方法，我们这里也考虑一下成员方法
         *  当属性或方法在被拦截参数中则判断是属性还是方法进行拦截返回，
         *  如果是方法则返回方法，如果是属性则返回属性
         *  当未被拦截时直接返回target[prop]
         *  这里需要注意一下运算符的优先级，不想注意的小友多加俩括号也是一样的效果
         */
      const _proxy = (object, ...prototypes) => {
        // 补全代码
        return new Proxy(object, {
          get: (target, prop) =>
            prototypes.includes(prop)
              ? typeof target[prop] === "function"
                ? () => "noright"
                : "noright"
              : target[prop]
        });
      };

      class Person {
        constructor(name) {
          this.name = name;
        }
        getName() {
          return this.name;
        }
      }

      //因为拦截了getName方法，所以getName方法被拦截了，但name属性没有被拦截
      let person = new Person("小明");
      let proxiedPerson = _proxy(person, "getName");
      console.log(proxiedPerson.name); //小明
      console.log(proxiedPerson.getName()); //noright

      //因为拦截了name属性，所以name属性被拦截了，getName方法调用了name属性所以也被拦截了
      let proxiedPerson2 = _proxy(person, "name");
      console.log(proxiedPerson2.name); //noright
      console.log(proxiedPerson2.getName()); //noright
    </script>
  </body>
</html>
